javap是jdk工具中自帶的反編譯工具,它是根據class位元組碼檔案,反解析出當前類對應的code區(彙編指令)、本地變量表、異常表和程式碼行偏移量對映表、常量池等重要資訊。不過有些資訊是得透過在編譯(javac)時,指定引數才能輸出。
以下為javap
指令使用介紹
javap [option] <classfile>
classfile: 就是你要反編譯的class檔案
option: 放置參數。可在終端機中直接輸數javap
或javap -help
即可看到有哪些參數可以使用
依照參數作用的類型我大致分成三大塊,如下:
-vserion
:當前反編譯的jdk版本
-public
:僅顯示公共類和成員-protected
:顯示受保護的/公共類和成員-p
-private
:顯示所有類和成員-package
:顯示程序包/受保護的/公共類和成員-sysinfo
:顯示正在處理的類的系統訊息(路徑、大小、日期、MD5)-constants
:顯示靜態最終常量
-s
:列出內部類型簽名-l
:列出行數和本地變量表-c
:反彙編代碼-v
-vervose
:輸出附加訊息
準備一個名為JavapTest.java
的檔案,程式碼如下:
package Controller;
public class JavapTest{
public String publicString;
protected String protectedString;
String friendlyString;
private String privateString;
public static final String staticString1 = "static final";
static {
String staticString2 = "測試";
}
{
String privateString = "javap test";
}
private void privateConstructor(){
}
int getNum(int x){
return x+x;
}
protected String showProtectedString(){
return protectedString;
}
public void showInfo(){
int x = 10;
System.out.println(privateString+x);
}
}
將其檔案進行編譯,編譯方式請參考Day4-java語言編譯器:javac & 運行工具:java (上)
有了class檔案後,即可加入不同的參數進行查看。
-version
javap -version
其實-version這參數作用指的是當前javap工具的版本,而非該class編譯時的版本,故只要下javap -version
即可查看。
-public
javap -public JavapTest.class
-protected
javap -protected JavapTest.class
-p
-private
javap -p JavapTest.class
或
javap -private JavapTest.class
-package
javap -package JavapTest.class
-sysinfo
javap -sysinfo JavapTest.class
-constants
javap -constants JavapTest.class
-s
javap -s JavapTest.class
-l
javap -l JavapTest.class
-c
javap -c JavapTest.class
-v
-verbose
javap -v JavapTest.class
或
javap -verbose JavapTest.class
最常使用到的參數大概只有-l
、-c
、-v
,不過在使用這些參數時,要特別注意,顯示出來的可能只會有protected以上的級別,若要查看全部的類別時,再多加上-p
參數即可。
例:
javap -l JavaTest.class
javap -l -p JavaTest.class